package cn.jtfadmin.base.lang.common.domain.dto;

import cn.jtfadmin.base.lang.config.statuscode.DefaultErrorStatusCodeConfig;
import cn.jtfadmin.base.lang.config.statuscode.SuccessStatusCodeConfig;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;

/**
 * 接口返回数据通用格式
 *
 * @param <T> 返回实际数据类型
 * @author jtf
 * @since 0.0.1
 */
@Getter
@Setter
@ToString
public class ResultDTO<T> implements Serializable {


    /**
     *
     */
    private static final long serialVersionUID = 1L;

    /**
     * 成功标志 缺省true
     */
    private boolean success = true;

    /**
     * 返回处理消息
     */
    private String message = SuccessStatusCodeConfig.SUCCESS_MSG;

    /**
     * 返回代码
     */
    private Integer code = SuccessStatusCodeConfig.SUCCESS_CODE;

    /**
     * 返回数据对象 data
     */
    private T result;

    /**
     * 错误明细
     */
    private String messageDetail;

    /**
     * 当前时间戳
     */
    private long timestamp = System.currentTimeMillis();

    private ResultDTO() {
    }


    /**
     * 缺省的成功返回
     *
     * @param <V>
     * @return
     */
    public static <V> ResultDTO<V> success() {
        return new ResultDTO<>();
    }

    /**
     * 自定义消息的成功返回
     *
     * @param msg 成功消息
     * @param <V>
     * @return
     */
    public static <V> ResultDTO<V> success(String msg) {
        ResultDTO<V> r = new ResultDTO<>();
        r.setMessage(msg);
        return r;
    }

    /**
     * 自定义成功数据的消息返回
     *
     * @param data 成功数据
     * @param <V>
     * @return
     */
    public static <V> ResultDTO<V> successData(V data) {
        ResultDTO<V> r = new ResultDTO<>();
        r.setResult(data);
        return r;
    }

    /**
     * 自定义成功数据的消息返回
     *
     * @param data    成功数据
     * @param message 成功消息
     * @param <V>
     * @return
     */
    public static <V> ResultDTO<V> successData(V data, String message) {
        ResultDTO<V> r = new ResultDTO<>();
        r.setResult(data);
        r.setMessage(message);
        return r;
    }


    /**
     * 错误时处理
     *
     * @param msg           错误消息
     * @param messageDetail 错误消息明细
     * @param <V>
     * @return
     */
    public static <V> ResultDTO<V> error(String msg, String messageDetail) {
        ResultDTO<V> r = new ResultDTO<>();
        r.setSuccess(false);
        r.setCode(DefaultErrorStatusCodeConfig.ERROR);
        r.setMessage(msg);
        r.setMessageDetail(messageDetail);
        return r;
    }

    /**
     * 错误时处理
     *
     * @param msg 错误消息
     * @param <V>
     * @return
     */
    public static <V> ResultDTO<V> error(String msg) {
        ResultDTO<V> r = new ResultDTO<>();
        r.setSuccess(false);
        r.setCode(DefaultErrorStatusCodeConfig.ERROR);
        r.setMessage(msg);
        return r;
    }

    /**
     * 错误时处理
     *
     * @param code 错误码
     * @param msg  错误消息
     * @param <V>
     * @return
     */
    public static <V> ResultDTO<V> error(Integer code, String msg) {
        ResultDTO<V> r = new ResultDTO<>();
        r.setSuccess(false);
        r.setCode(code);
        r.setMessage(msg);
        return r;
    }

    /**
     * 错误时处理
     *
     * @param messageDetail 错误消息明细
     * @param <V>
     * @return
     */
    public static <V> ResultDTO<V> errorDetail(String messageDetail) {
        ResultDTO<V> r = new ResultDTO<>();
        r.setSuccess(false);
        r.setCode(DefaultErrorStatusCodeConfig.ERROR);
        r.setMessage(DefaultErrorStatusCodeConfig.ERROR_MSG);
        r.setMessageDetail(messageDetail);
        return r;
    }

    /**
     * 错误时处理
     *
     * @param errorCode     错误码
     * @param msg           错误消息
     * @param messageDetail 错误消息明细
     * @param <V>
     * @return
     */
    public static <V> ResultDTO<V> error(Integer errorCode, String msg, String messageDetail) {
        ResultDTO<V> r = new ResultDTO<>();
        r.setSuccess(false);
        r.setCode(errorCode);
        r.setMessage(msg);
        r.setMessageDetail(messageDetail);
        return r;
    }

}
